#include <iostream>
#include <cstdio>
#include <cstring>
#include <thread>
#include <pthread.h>
#include <unistd.h>

int *ccc = nullptr;

void *stats1(void *agse)
{
	pthread_detach(pthread_self());

	std::string name = static_cast<char *>(agse);
	int a = 0;
	ccc = &a;
	while (true)
	{
		std::cout << name << "没修改：" << a << std::endl;
		sleep(1);
		// break;
	}
	// return (void*)10;
	// pthread_exit((void*)10);
}

int main()
{
	pthread_t tid1;
	pthread_create(&tid1, nullptr, stats1, (void *)"thread->1");

	sleep(5);
	// pthread_detach(tid1);
	void* ret = nullptr;
	int n = pthread_join(tid1, &ret);
	std::cout << "new thread exit code: " << (long long int)ret << "返回值：" << n << std::endl;

	return 0;
}


// int *ccc = nullptr;

// void *stats1(void *agse)
// {
// 	std::string name = static_cast<char *>(agse);
// 	int a = 0;
// 	ccc = &a;
// 	while (true)
// 	{
// 		std::cout << name << "没修改：" << a << std::endl;
// 		sleep(1);
// 		// break;
// 	}
// 	// return (void*)10;
// 	// pthread_exit((void*)10);
// }

// int main()
// {
// 	pthread_t tid1;
// 	pthread_create(&tid1, nullptr, stats1, (void *)"thread->1");

// 	sleep(5);
// 	pthread_cancel(tid1);
// 	std::cout << "new thread cancel success: " << (long int)tid1 << std::endl; 
// 	sleep(5);


// 	void* ret = nullptr;
// 	pthread_join(tid1, &ret);
// 	std::cout << "new thread exit code: " << (long long int)ret << std::endl;

// 	return 0;
// }


//----------------------------------------------------------------
// 进程之间有独立的栈，但一个线程也可以看到其他栈的内容

// int *ccc = nullptr;

// void *stats1(void *agse)
// {
// 	std::string name = static_cast<char *>(agse);
// 	int a = 0;
// 	ccc = &a;
// 	while (true)
// 	{
// 		std::cout << name << "没修改：" << a << std::endl;
// 		sleep(1);
// 	}
// }
// void *stats2(void *agse)
// {
// 	std::string name = static_cast<char *>(agse);
// 	while (true)
// 	{
// 		if (ccc != nullptr)
// 			std::cout << name << "修改后：" << (*ccc)++ << std::endl;
// 		sleep(1);	
// 	}
// }

// int main()
// {
// 	pthread_t tid1, tid2;
// 	pthread_create(&tid1, nullptr, stats1, (void *)"thread->1");
// 	pthread_create(&tid2, nullptr, stats2, (void *)"thread->2");

// 	pthread_join(tid1, nullptr);
// 	pthread_join(tid2, nullptr);

// 	return 0;
// }

//----------------------------------
// 多线程创建
// class ThreadNode
// {
// public:
// 	ThreadNode(){}
// 	void Init(std::string name, int a, int b)
// 	{
// 		_name = name;
// 		_a = a;
// 		_b = b;
// 	}
// 	void Excute()
// 	{
// 		_result =_a + _b;
// 	}
// 	std::string Name()
// 	{
// 		return _name;
// 	}
// 	int Result(){return _result;}
// 	void setid(pthread_t id){_id = id;}
// 	pthread_t ID(){return _id;}
// 	int A(){return _a;}
// 	int B(){return _b;}
// 	~ThreadNode()
// 	{
// 	}

// private:
// 	std::string _name;
// 	int _a;
// 	int _b;
// 	int _result;
// 	pthread_t _id;
// };

// std::string conversion(pthread_t tid)
// {
// 	char buffer[64];
// 	snprintf(buffer, sizeof(buffer), "0x%lx", tid);
// 	return buffer;
// }

// void *rounine(void *args)
// {
// 	ThreadNode *td = static_cast<ThreadNode *>(args);
// 	while (true)
// 	{
// 		std::cout << "我是新线程：name：" << td->Name() << ",my thread id: " << conversion(pthread_self()) << std::endl;
// 		td->Excute();//完成任务
// 		sleep(1);
// 		break;
// 	}
// 	// std::cout << "void*10: " << (void*)10 << sizeof(void) << std::endl;
// 	// int *p = new int(10);
// 	// return (void*)p;
// 	// return (void*)10; // 线程退出方式 ： 1.线程入口函数return ，表示线程退出情况
// 					  // 返回值问题：返回值可以是变量，数字，也可以是对象！
// 	return td; // 返回对象
// }

// #define NUM 10

// int main()
// {
// 	ThreadNode tid[NUM];
// 	// 初始化
// 	for(int i = 0;i < NUM;i++)
// 	{
// 		char buff[64];
// 		snprintf(buff,sizeof(buff),"thread->%d",i);
// 		tid[i].Init(buff,i*10,i*20);
// 	}
// 	//创建十个线程
// 	for(int i = 0;i < NUM;i++)
// 	{
// 		pthread_t id;
// 		pthread_create(&id,nullptr,rounine,&tid[i]);
// 		// printf("-------------------");
// 		// printf("%ld",id);
// 		// printf("-------------------");

// 		tid[i].setid(id);
// 	}
// 	// 等待多线程
// 	for(int i = 0;i < NUM;i++)
// 	{
// 		pthread_join(tid[i].ID(),nullptr);
// 	}

// 	// 查看执行结果
// 	for(int i = 0;i < NUM;i++)
// 	{
// 		printf("tid[%d]:%d+%d=%d[%ld]\n",i,tid[i].A(),tid[i].B(),tid[i].Result(),tid[i].ID());
// 	}

// 	return 0;
// }

//------------------------------------------------------------
// class ThreadNode
// {
// public:
// 	ThreadNode(std::string name, int a, int b)
// 		: _name(name), _a(a), _b(b)
// 	{
// 	}
// 	int Excute()
// 	{
// 		return _a + _b;
// 	}
// 	std::string Name()
// 	{
// 		return _name;
// 	}
// 	~ThreadNode()
// 	{
// 	}

// private:
// 	std::string _name;
// 	int _a;
// 	int _b;
// };

// std::string conversion(pthread_t tid)
// {
// 	char buffer[64];
// 	snprintf(buffer, sizeof(buffer), "0x%lx", tid);
// 	return buffer;
// }

// void *rounine(void *args)
// {
// 	ThreadNode *td = static_cast<ThreadNode *>(args);
// 	while (true)
// 	{
// 		std::cout << "我是新线程：name：" << td->Name() << ",my thread id: " << conversion(pthread_self()) << std::endl;
// 		std::cout << "a+b = " << td->Excute() << std::endl;
// 		sleep(1);
// 		break;
// 	}
// 	// std::cout << "void*10: " << (void*)10 << sizeof(void) << std::endl;
// 	int *p = new int(10);
// 	return (void*)p;
// 	// return (void*)10; // 线程退出方式 ： 1.线程入口函数return ，表示线程退出情况
// 					  // 返回值问题：返回值可以是变量，数字，也可以是对象！
// }

// int main()
// {
// 	// 1.新线程和main线程谁先运行不确定
// 	// 2.线程创建出来要对进程的时间片进行瓜分
// 	pthread_t tid;
// 	ThreadNode *td = new ThreadNode("thread->11", 4, 5);
// 	// 传递参数可以是变量，数字，也可以是对象
// 	pthread_create(&tid, nullptr, rounine, td);

// 	void *ret = nullptr;
// 	int n = pthread_join(tid, &ret); // ret拿到的值就算线程的返回值
// 	if (n != 0)
// 	{
// 		std::cout << "join error: " << n << " " << strerror(n) << std::endl;
// 		return 1;
// 	}
// 	std::cout << sizeof(void*) << sizeof(long) << sizeof(long long) << sizeof(long long int) << std::endl;
// 	std::cout << "join success! ret: " << *(int*)ret << std::endl;

// 	while (true)
// 	{
// 		std::cout << "我是main进程...." << std::endl;
// 		sleep(1);
// 	}
// 	return 0;
// }

//------------------------------------------------------------
// std::string conversion(pthread_t tid)
// {
// 	char buffer[64];
// 	snprintf(buffer,sizeof(buffer),"0x%lx",tid);
// 	return buffer;
// }

// void* rounine(void* args)
// {
// 	std::string name = static_cast<char*>(args);
// 	while(true)
// 	{
// 		std::cout << "我是新线程：name：" << name << ",my thread id: " << conversion(pthread_self()) << std::endl;
// 		sleep(1);
// 		// break;
// 	}
// 	return nullptr;
// }

// int main()
// {
// 	// 1.新线程和main线程谁先运行不确定
// 	// 2.线程创建出来要对进程的时间片进行瓜分
// 	pthread_t tid;
// 	pthread_create(&tid,nullptr,rounine,(void*)"thread->1");
// 	// std::cout << "new thread id: " << tid << std::endl;
// 	printf("new thread id:0x%lx\n",tid);

// 	// 线程也需要被等待回收！！！
// 	// a. 类似于僵尸进程一样的问题造成内存泄露， b. 要知道线程的退出结果

// 	int n = pthread_join(tid,nullptr);
// 	if(n != 0)
// 	{
// 		std::cout << "join error: " << n  << " " << strerror(n) << std::endl;
// 		return 1;
// 	}
// 	std::cout << "join success!" << std::endl;

// 	while(true)
// 	{
// 		std::cout << "我是main进程...." << std::endl;
// 		sleep(1);
// 	}
// 	return 0;
// }

//------------------------------------------------------------
// C++11线程创建，本质封装了pthread库
// int main()
// {
// 	std::thread t([](){
// 		while (true)
// 		{
// 			std::cout << "我是新线程，我的名字是：newthread" << std::endl;
// 			sleep(1);
// 		}
// 	});

// 	while (true)
// 	{
// 		std::cout << "我是main线程...." << std::endl;
// 		sleep(1);
// 	}
// 	return 0;
// }

//------------------------------------------------------------
// 线程创建
// void *routine(void* args)
// {
// 	std::string name = static_cast<const char*>(args);

// 	while (true)
// 	{
// 		/* code */
// 		std::cout << "我是新线程，我的名字是：" << name << std::endl;
// 		sleep(1);
// 	}

// 	return nullptr;
// }

// int main()
// {
// 	pthread_t tid;
// 	int n = pthread_create(&tid,nullptr,routine,(void*)"thread-1");
// 	if(n != 0)
// 	{
// 		std::cout << "create thread error: " << strerror(n) << std::endl;
// 		return 1;
// 	}

// 	while(true)
// 	{
// 		std::cout << "我是main线程...." << std::endl;
// 		sleep(1);
// 	}
// 	return 0;
// }
//------------------------------------------------------------
// 创建线程
// void *run(void* tread)
// {
// 	while(true)
// 	{
// 		std::cout << "new tread,getpid: " << getpid() << std::endl;
// 		sleep(2);
// 	}
// 	return nullptr;
// }

// int main()
// {
// 	pthread_t tid;
// 	pthread_create(&tid,nullptr,run,(void*)"tread-1");

// 	while(true)
// 	{
// 		std::cout << "main tread,getpid: " << getpid() << std::endl;
// 		sleep(1);
// 	}

// 	return 0;
// }